package com.cskaoyan.javase.oop2._0encapsulate;

import java.util.concurrent.locks.ReadWriteLock;

/**
 * 封装的基本理解:
 * 封装（encapsulate）是指将数据及相关操作绑定在一起的一种编程机制，使其构成一个不可分割的独立实体。在Java中，类就是这样一种结构。
 * 当然，数据被保护在类的内部，是为了尽可能地隐藏内部的细节(尽量给严格的访问权限,private)，只保留一些对外"接口"使之与外部发生联系(public)。
 *
 * 之所以要封装，是为了将代码的使用者和实现者分开。使用者能够完全得到自己想要的功能，又不需要思考过多细节；实现者可以隐藏功能实现的细节，方便灵活进行修改而不影响使用者使用。
 * 在java中封装的实现,要依赖于访问权限修饰符.
 *
 *
 * @since 16:16
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Student s = new Student();
        // System.out.println(s.age);
        System.out.println(s.getAge());
        s.setAge(1000);
        System.out.println(s.getAge());
    }
}

class Student {
    /*
        假如年龄这个属性,不希望被外界访问,那咋办?
        私有化它就可以了.

        但是假如我们有在外界访问属性的需求,而且我们希望能够控制这个访问,那又咋办呢?
        这时,仍然需要私有化它,为了让外界能够访问并且能够控制访问,需要提供方法给外界使用.
        这就是常说的Getter/Setter方法
        Getter方法用于提供访问的手段,Setter方法用于提供赋值的手段.并且它们的命名有固定的格式
        setXxx getXxx

        Getter/Setter方法有什么作用?
        最主要的作用是控制成员变量的访问
        除此之外,还把成员变量的读和写分开了

        在实际开发中,多数情况下,不要让外界直接访问对象的成员变量,如果确有访问需求,就提供Getter/Setter方法.
        只有在极少数情况下,成员变量才会public修饰

        当然,我们这里要做一个约定:
            为了上课方便,我就不这么做了.大家写作业或者写项目时,要遵守私有化成员变量
     */
    private int age;

    // age的访问方法
    public int getAge() {
        // 不管我多少岁,但是别人看我,只能说我18岁
        return age;
    }

    // age的赋值方法
    public void setAge(int age) {
        /*
            人的寿命目前来说:
                1-150
         */
        if (age < 1){
            System.out.println("您还未出生吗?");
            return;
        }
        if (age > 150){
            System.out.println("您还活着呢?");
            return;
        }
        System.out.println("正常,赋值成功!");
        this.age = age;
    }
}